package org.rslai.tcedit.business;

import java.util.List;
import java.util.Set;
import org.rslai.tcedit.domain.Page;
import org.rslai.tcedit.domain.Role;
import org.rslai.tcedit.domain.User;
import org.rslai.tcedit.domain.UserDetails;
import org.springframework.transaction.annotation.Transactional;

/**
 * 用户 业务逻辑接口
 * @author rslai
 */
@Transactional
public interface UserService extends BaseService {

	/**
	 * 新增一个用户
	 * @param user user对象
	 * @param userDetails userDetails对象
	 * @param roles role列表
	 */
	void create(User user, UserDetails userDetails, Set<Role> roles);

	/**
	 * 更新 User 对象
	 * @param user user对象
	 * @param userDetails userDetails对象
	 * @param roles role列表
	 */
	void update(User user, UserDetails userDetails, Set<Role> roles);

	/***
	 * 查询用户列表
	 * @param asc true 为升序，false 为降序
	 * @return 用户列表
	 */
	@Transactional(readOnly = true)
	public List<User> query(boolean asc);

	/***
	 * 根据输入的用户名、真实姓名、email查询用户列表
	 * @param page page
	 * @param username 用户名，前后加 % 号为模糊查询，例如：%user%。不加 % 为精确查询。 只有 % 为查询所有
	 * @param realName 真实姓名，前后加 % 号为模糊查询，例如：%user%。不加 % 为精确查询。 只有 % 为查询所有
	 * @param email email，前后加 % 号为模糊查询，例如：%user%。不加 % 为精确查询。 只有 % 为查询所有
	 * @param asc true 为升序，false 为降序
	 * @return 用户信息列表
	 */
	@Transactional(readOnly = true)
	List<User> query(Page page, String username, String realName, String email, boolean asc);

	/**
	 * 根据输入的用户名查询 User 对象
	 * @param username 用户名
	 * @return 返回 User 对象
	 */
	@Transactional(readOnly = true)
	User query(String username);

	/**
	 * Change the account's password. Only current user can call this method,
	 * otherwise an AccessDeniedException is thrown.
	 * @param username The current Account's username.
	 * @param oldPassword The old password.
	 * @param newPassword The new password.
	 */
	void changePassword(String username, String oldPassword, String newPassword);

}
